home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Opus5.5 / ARexx.lha / ARexx / UnDMS.dopus5 < prev    next >
Text File  |  1996-06-04  |  4KB  |  127 lines

  1. /*
  2.   $VER: UnDMS.dopus5 2.1 (7.4.96)
  3.   Written by Edmund Vermeulen (edmundv@grafix.xs4all.nl). 
  4.  
  5.   ARexx script for Directory Opus 5.5 to unpack a DMS file to disk with
  6.   progress indication.
  7.  
  8.   Call it from the 'Double-click' function of the 'DiskMasher archive'
  9.   filetype.
  10.  
  11.   Function : ARexx      DOpus5:ARexx/UnDMS.dopus5 {f} {Qp}
  12.   Flags : Run asynchronously
  13. */
  14.  
  15. devicecheck = '_DF0'
  16. automount   = 'FF_0 FF_1 FF_2 FF_3 FF_4'
  17.  
  18.  
  19. parse arg '"' dmsfile '"' portname .
  20.  
  21. if portname='' then
  22.    portname='DOPUS.1'
  23. address value portname
  24.  
  25. cuthere=lastpos('/',dmsfile)
  26. if cuthere=0 then
  27.    cuthere=pos(':',dmsfile)
  28. dmsname="'"substr(dmsfile,cuthere+1)"'"
  29.  
  30. options results
  31. lf='0a'x  /* ascii code for linefeed */
  32.  
  33. if ~show('l','rexxsupport.library') then
  34.    call addlib('rexxsupport.library',0,-30)  /* needed for showlist() and delete() */
  35.  
  36. buttons=''
  37. n=0
  38.  
  39. /* only show the devices that are really available */
  40. do while devicecheck~=''
  41.    parse var devicecheck devbutton devicecheck
  42.    dest=compress(devbutton,'_')
  43.    if showlist('h',dest) then do
  44.       n=n+1
  45.       dest.n=dest
  46.       buttons=buttons||devbutton'|'
  47.       end
  48.    end
  49.  
  50. /* add automount devices */
  51. do while automount~=''
  52.    n=n+1
  53.    parse var automount devbutton automount
  54.    dest.n=compress(devbutton,'_')
  55.    buttons=buttons||devbutton'|'
  56.    end
  57.  
  58. dopus front
  59. dopus request '"Please insert disk in drive and then select'lf'destination for' dmsname'."' buttons'_Cancel'
  60. if rc=0 then
  61.    exit
  62.  
  63. devname=dest.rc
  64. if ~showlist('h',devname) then
  65.    address command 'Mount' devname':'  /* automatically mount it */
  66.  
  67. dopus progress info bar abort
  68. handle=result
  69. dopus progress handle title 'Unpacking' dmsname'...'
  70.  
  71. /* wow! some clever stuff here... */
  72. address command 'Run >T:UnDMS.'handle '<NIL: DMS <NIL: >PIPE:dmsout.'handle 'WRITE "'dmsfile'" TO' devname':' 'NOTEXT'
  73. call open('temp','T:UnDMS.'handle,'r')
  74. process=readln('temp')
  75. parse var process '[CLI ' process ']'
  76. close('temp')
  77. call delete('T:UnDMS.'handle)
  78.  
  79. nomessage=1
  80. errorreport=''
  81. buffer=''
  82. call open('dmsout','PIPE:dmsout.'handle,'r')    /* output from DMS comes through PIPE: */
  83.  
  84. do until eof('dmsout')
  85.    buffer=buffer||readch('dmsout',25)    /* read portions of 25 characters */
  86.    here=verify(buffer,'0a0d'x,'m')    /* check for new lines */
  87.    if here>0 then do
  88.       line=left(buffer,here-1)        /* one whole line */
  89.       if nomessage&left(line,7)='No Disk' then do
  90.          dopus progress handle info 'Insert disk in' devname
  91.          nomessage=0
  92.          end
  93.       if pos('Write-Protected',line)>0 then do
  94.          address command 'Break' process 'C'
  95.          dopus progress handle off
  96.          dopus front
  97.          dopus request '"Disk in drive' devname 'is write protected." _OK'
  98.          exit
  99.          end
  100.       parse var line ' ' line            /* get rid of some ugly stuff */
  101.       buffer=substr(buffer,here+1)
  102.       if pos('ERROR',upper(line))>0 then do    /* remember every line with the word 'error' in it */
  103.          errorreport=errorreport||lf||line
  104.          command flash
  105.          end
  106.       if pos('unPacking',line)>0 then do    /* progress indication */
  107.          track=right(line,2)
  108.          dopus progress handle info 'Track' track
  109.          dopus progress handle bar 80 track+1
  110.          dopus progress handle abort
  111.          if result then do
  112.             address command 'Break' process 'C'
  113.             dopus progress handle off
  114.             exit
  115.             end
  116.          end
  117.       end
  118.    end
  119.  
  120. call close('dmsout')
  121. dopus progress handle off
  122.  
  123. if errorreport~=='' then do
  124.    dopus front
  125.    dopus request '"UnDMS Error Report for' dmsname||lf||errorreport'" _OK'
  126.    end
  127.